package com.mybatisplus.demo.android.util;

import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.interfaces.DecodedJWT;

import java.util.Date;
import java.util.HashMap;
import java.util.Map;

/**
 * token 生成工具
 * JWT：JSON  Web  Token，其实token就是一段字符串，由三部分组成：Header，Payload，Signature。
 * <p>
 * 由于jwt只能校验单点登录 再多点登陆的情况下 无法验证时间戳必须读取 user数据
 */
public class JwtUtil {


    /**
     * 令牌过期时间 // 过期时间，单位毫秒
     */
    private static final long EXPIRE_TIME = 3600 * 24 * 7 * 1000;

    /**
     * toekn加密密钥
     */
    private static final String TOKEN_SECRET = "jkk415513lkfhuyant29809faw7241";


    /**
     * @param user_id
     * @return 返回一个 jwt加密的签名
     */
    public static String sign(String user_id) {


        try {
            //过期时间
            Date date = new Date(System.currentTimeMillis() + EXPIRE_TIME);
            //密钥及加密算法
            Algorithm algorithm = Algorithm.HMAC256(TOKEN_SECRET);
            //设置头部信息
            Map<String, Object> header = new HashMap<>(2);
            header.put("type", "JWT");
            header.put("alg", "HS256");
            //将附带信息生成签名
            return JWT.create()
                    .withHeader(header)//添加头
                    .withClaim("user_id", user_id)
                    .withExpiresAt(date)//过期时间
                    .sign(algorithm);

        } catch (Exception e) {
            return null;
        }
    }

    /**
     * 校验 token
     *
     * @param token
     * @return
     */
    public static boolean verify(String token) {

        try {
            //密钥及加密算法
            Algorithm algorithm = Algorithm.HMAC256(TOKEN_SECRET);
            JWTVerifier verifier = JWT.require(algorithm).build();
            DecodedJWT decodedJWT = verifier.verify(token);

            return true;
        } catch (Exception e) {
            return false;
        }


    }

    /**
     * 获取token中的信息
     *
     * @param token
     * @return
     */
    public static String getUserId(String token) {
        try {
            DecodedJWT decodedJWT = JWT.decode(token);

            return decodedJWT.getClaim("user_id").asString();
        } catch (Exception e) {
            return null;
        }

    }

}
